package com.fjl.list.leetcode206;

import com.fjl.list.ListNode;

/**
 * @Description
 * @Author: 01195
 * @Date: 2025/2/24 9:51
 */
// 给你单链表的头指针 head 和两个整数 left 和 right ，其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点，返回 反转后的链表 。
public class ReverseBetweenListClass {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if (left == 1) {
            return reverseN(head, right);
        }
        ListNode mPrev = head;
        for (int i = 1; i < left - 1; i++) {
            mPrev = mPrev.next;
        }
        ListNode reverseHead = reverseN(mPrev.next, right - left + 1);
        mPrev.next = reverseHead;
        return head;
    }

    // 将链表的前 n 个节点反转（n <= 链表长度）
    ListNode reverseN(ListNode head, int n) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode pre, cur, nxt;
        pre = null; cur = head; nxt = head.next;
        while (n > 0) {
            cur.next = pre;
            pre = cur;
            cur = nxt;
            n--;
            if (nxt != null) {
                nxt = nxt.next;
            }
        }
        head.next = cur;
        return pre;
    }
}